package modelo;

import static modelo.SetUps.PUNTOS_PASO_NIVEL;
import vista.VistaFactory;
import vista.VistaMenu;
import ar.uba.fi.algo3.titiritero.ObjetoVivo;
import ar.uba.fi.algo3.titiritero.vista.ObjetoDeTexto;

/*
 * esta clase se encarga de crear las naves correspondientes
 * a cada nivel
 */
public class Nivel implements ObjetoVivo, ObjetoDeTexto{
	
	private Escenario escenario;
	private Jugador jugador;
	private FlotaEnemiga flotaEnemigos;
	private FlotaNeutrales flotaNeutrales;
	private CambioNivel cambioNivel;
	private boolean ganado = false;
	private Controlador1942 controlador;

	public Nivel() {
		jugador = new Jugador();
		escenario = new Escenario(jugador);
		cambioNivel = new CambioNivel();
		flotaEnemigos = new FlotaEnemiga(cambioNivel.getRetardoCreacion());
		flotaNeutrales = new FlotaNeutrales(cambioNivel.getRetardoNeutrales());
	}
	
	public Nivel (Jugador jugador, CambioNivel cambioNivel){
		this.jugador = jugador;
		this.cambioNivel = cambioNivel;
		escenario = new Escenario (jugador);
		flotaEnemigos = new FlotaEnemiga(cambioNivel.getRetardoCreacion());
		flotaNeutrales = new FlotaNeutrales(cambioNivel.getRetardoNeutrales());
	}
	
	public void setControladorVistas (Controlador1942 controlador){
		this.controlador = controlador;
		controlador.limpiarDibujables();
		escenario.setControladorVistas(controlador);
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaFondo());
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaPuntos(jugador));
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaEnergia(jugador));
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaVidas(jugador));
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaMunicion(jugador));
		controlador.agregarDibujable(VistaFactory.getInstance().getVistaNivel(this));
		escenario.reiniciar();
	}
	
	public void vivir() {
		this.agregarNuevosObjetos();
		escenario.vivir();
		this.chequearNivel();
	}

	private void agregarNuevosObjetos(){
		flotaEnemigos.actualizar();
		if (flotaEnemigos.tieneNaves()){
			escenario.agregarObjetoYVista(flotaEnemigos.getNave());
		}
		if (flotaNeutrales.tieneNaves()){
			escenario.agregarObjetoYVista(flotaNeutrales.getNave());
		}
	}
	
	/*
	 * debe cambiar de nivel al alcanzar cierto puntaje
	 */
	private void chequearNivel() {
		// si no se ha llegado a los puntos necesarios
		// no hay nada que hacer
		if (jugador.getPuntos() > PUNTOS_PASO_NIVEL*cambioNivel.getNumeroNivel()){
			//juego ganado
			if (cambioNivel.nivelesAgotados()){
				ganado = true;
				return;
			}
			cambioNivel.cambiarNivel();
			this.reiniciar();
		}

	}
	
	private void reiniciar() {
		
		flotaEnemigos = new FlotaEnemiga (cambioNivel.getRetardoCreacion());
		flotaNeutrales = new FlotaNeutrales(cambioNivel.getRetardoNeutrales());
		//jugador.reiniciarPuntos(); Que siga con los mismos puntos!
		this.setControladorVistas(controlador);
	}

	public Escenario getEscenario(){
		return escenario;
	}
	
	public Jugador getJugador(){
		return jugador;
	}
	
	public boolean ganado(){
		return ganado;
	}

	public CambioNivel getCambioNivel() {
		return cambioNivel;
	}
	
	public Controlador1942 getControlador(){
		return controlador;
	}
	
	public int getNumeroNivel(){
		return cambioNivel.getNumeroNivel();
	}

	public String getTexto() {
		return "Nivel: "+Integer.toString(this.getNumeroNivel());
	}
	
	public void setEscenarioVistaMenu(VistaMenu menu){
		escenario.setVistaMenu(menu);
	}
}
	
